package com.parse;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Scope {
    private Scope enclosingScope; // 上层作用域
    private Map<String, Symbol> symbols = new LinkedHashMap<>(); // 当前作用域内的符号表
    private String scopeName; // 作用域名称
    private int level; // 作用域层级

    public Scope(String scopeName, int level, Scope enclosingScope) {
        this.scopeName = scopeName;
        this.level = level;
        this.enclosingScope = enclosingScope;
    }

    public Scope getEnclosingScope() {
        return enclosingScope;
    }

    public String getScopeName() {
        return scopeName;
    }

    public int getLevel() {
        return level;
    }

    /**
     * 添加符号到作用域内
     * @param symbol
     */
    public void define(Symbol symbol) {
        symbols.put(symbol.getName(), symbol);
        symbol.setScope(this);
    }

    /**
     * 获取当前作用域内的指定名称的符号
     * @param name 符号名称
     * @return 符号对象
     */
    public Symbol resolve(String name) {
        Symbol symbol = symbols.get(name);
        if (symbol != null) {
            return symbol;
        }
        // 如果当前作用域没有该符号，则查找上层作用域
        if (enclosingScope != null) {
            return enclosingScope.resolve(name);
        }
        return null;
    }

    /**
     * 获取当前作用域内的所有符号
     * @return 符号列表
     */
    public List<Symbol> getAllSymbols() {
        return new ArrayList<>(symbols.values());
    }
}
